//axios的配置
import axios from "axios";

//引入进度条
import nprogress from "nprogress"

//引入element-ui
import { MessageBox, Message } from "element-ui"
// console.log(MessageBox)

//对axios进行一些简单的配置
//axios的通用配置
let http = axios.create({
    withCredentials: true,//是否携带凭证
    baseURL: "/api",//基础地址
    timeout: 5000,//超时设置
})
//请求拦截
//如果请求过多,都需要携带参数,在api接口一个个的加会很麻烦,而我们的拦截器可以拦截每一个请求,此时可以进行添加参数,写一次就行了
http.interceptors.request.use(config => {
    //config就是请求的对象,里面可以拿到请求的地址 参数等

    nprogress.start()
    //获取到localStorage中的token
    let token = localStorage.getItem("login-token")
    config.headers.authorization = token

    //return config 理解为放行
    return config
})

//响应拦截
//可以处理公共的错误
http.interceptors.response.use(config => {
    //config是响应对象,里面可以拿到服务器相应的内容

    nprogress.done()

    //嵌套解构语法
    let { data: { state, msg, code } } = config

    //code 10022登入过期 1004 token过期  10026没有权限
    //因为有了token他以为你已经登陆了 就会疯狂报错
    let codes = ["10022","1004","10026"]
    if(codes.includes(code)){
        //清除token
        localStorage.removeItem("login-token")
        //刷新页面
        location.reload()
    }
    //一个需要排除不需要弹框的数组接口
    let excludeUrl = ["/order/query_order_status"]

    //判断不需要弹框的数组中是否包含当前请求的路径
    let isExclude = excludeUrl.includes(config.config.url)
    //当上面为true 的时候 就是代表 这个地址是我们不需要弹框的地址  然后 下面就取反变成false &&里面有false 就不执行弹窗逻辑;
    //拦截器判断后端响应的state
    if (!state && !isExclude) {
        //全局提示
        //组建的 alert方法 
        MessageBox.alert(msg, "错误提示", { type: "error" })
    }

    //return config 就是放行
    return config
})

export default http